#!/bin/bash
# House Studio per Mac: nessun Terminale.
# Primo avvio: prepara il motore nella cartella dell'utente. Poi accende la casa e apre il pannello.
# Se la casa e gia accesa chiede se aprire il pannello o spegnerla.
set -uo pipefail

TITOLO="House Studio"
BUNDLE="$(cd "$(dirname "$0")/../.." && pwd)"
PAYLOAD="$BUNDLE/Contents/Resources/app"
BASE="${HOUSE_STUDIO_INSTALL_ROOT:-$HOME/Library/Application Support/HouseStudio}"
APP="$BASE/app"
RUNTIME="$BASE/runtime"
DATI="$BASE/data"
REGISTRO="$BASE/house-studio.log"
PORTA="${HOUSE_STUDIO_PORT:-18080}"
NODE_VERSION="v26.10.0"

avviso() { [ -n "${HOUSE_STUDIO_SILENZIOSO:-}" ] && { echo "AVVISO $1"; return; }; osascript -e "display notification \"$1\" with title \"$TITOLO\"" >/dev/null 2>&1; }
errore() {
  echo "ERRORE $1" >> "$REGISTRO"
  [ -n "${HOUSE_STUDIO_SILENZIOSO:-}" ] && { echo "ERRORE $1"; exit 1; }
  osascript -e "display dialog \"$1\" with title \"$TITOLO\" buttons {\"OK\"} default button 1 with icon stop" >/dev/null 2>&1
  exit 1
}
apri_pannello() {
  [ -n "${HOUSE_STUDIO_SENZA_BROWSER:-}" ] && return
  TOKEN="$(tr -d '\r\n' < "$DATI/admin-token" 2>/dev/null)"
  open "http://127.0.0.1:$PORTA/#houseos-token=$TOKEN"
}

mkdir -p "$BASE" "$DATI" || errore "Non riesco a creare la cartella $BASE."
[ -f "$PAYLOAD/PAYLOAD-SHA256.json" ] || errore "Il programma e incompleto. Scaricalo di nuovo da lostartechnology.com."

# Casa gia accesa: lo dice il suo lucchetto, se il processo e ancora vivo.
if [ -f "$DATI/casa.lock" ]; then
  PID="$(sed -n 's/.*"pid": *\([0-9]*\).*/\1/p' "$DATI/casa.lock" | head -1)"
  if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then
    if [ -n "${HOUSE_STUDIO_SCELTA:-}" ]; then SCELTA="$HOUSE_STUDIO_SCELTA"; else
      SCELTA="$(osascript -e "button returned of (display dialog \"House Studio e acceso.\" with title \"$TITOLO\" buttons {\"Spegni\", \"Apri il pannello\"} default button 2)" 2>/dev/null)"
    fi
    if [ "$SCELTA" = "Spegni" ]; then
      CUSTODE="$(ps -o ppid= -p "$PID" | tr -d ' ')"
      if [ -n "$CUSTODE" ] && ps -o command= -p "$CUSTODE" | grep -q custode.js; then kill -TERM "$CUSTODE"; else kill -TERM "$PID"; fi
      for _ in $(seq 1 30); do kill -0 "$PID" 2>/dev/null || break; sleep 1; done
      avviso "House Studio e spento."
    elif [ "$SCELTA" = "Apri il pannello" ]; then
      apri_pannello
    fi
    exit 0
  fi
fi

# Il runtime locale: una volta sola, serve internet.
if [ ! -x "$RUNTIME/bin/node" ]; then
  case "$(uname -m)" in
    arm64) ARCH="darwin-arm64" ;;
    x86_64) ARCH="darwin-x64" ;;
    *) errore "Questo Mac non e supportato ($(uname -m))." ;;
  esac
  avviso "Preparo House Studio: serve internet per qualche minuto, solo la prima volta."
  TMP="$(mktemp -d /tmp/house-studio.XXXXXX)"
  curl -fsSL "https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-$ARCH.tar.gz" -o "$TMP/node.tar.gz" >> "$REGISTRO" 2>&1 \
    || errore "Non riesco a scaricare il motore. Controlla la connessione a internet e riapri House Studio."
  tar -xzf "$TMP/node.tar.gz" -C "$TMP" || errore "Il motore scaricato e danneggiato. Riapri House Studio."
  rm -rf "$RUNTIME" && mkdir -p "$RUNTIME" && cp -R "$TMP/node-$NODE_VERSION-$ARCH/." "$RUNTIME/"
  rm -rf "$TMP"
fi

# Il programma: si ricopia solo se questa versione non e ancora installata.
if ! cmp -s "$PAYLOAD/PAYLOAD-SHA256.json" "$APP/PAYLOAD-SHA256.json" || [ ! -d "$APP/node_modules" ]; then
  avviso "Installo House Studio..."
  # Prima nella cartella definitiva, poi npm: i collegamenti dei pacchetti interni restano validi.
  # La versione precedente resta da parte finche l'installazione non e riuscita.
  rm -rf "$APP.precedente"
  [ -d "$APP" ] && mv "$APP" "$APP.precedente"
  ditto "$PAYLOAD" "$APP" || errore "Non riesco a copiare il programma in $BASE."
  if ! ( cd "$APP" && PATH="$RUNTIME/bin:$PATH" "$RUNTIME/bin/npm" ci --omit=dev --no-audit --no-fund >> "$REGISTRO" 2>&1 ); then
    rm -rf "$APP"; [ -d "$APP.precedente" ] && mv "$APP.precedente" "$APP"
    errore "Installazione non riuscita. Controlla la connessione a internet e riapri House Studio."
  fi
  rm -rf "$APP.precedente"
fi

ALTRO="$(lsof -nP -iTCP:"$PORTA" -sTCP:LISTEN -t 2>/dev/null | head -1)"
[ -n "$ALTRO" ] && errore "La porta $PORTA e occupata da un altro programma. Chiudilo e riapri House Studio."

avviso "Accendo House Studio..."
echo "--- $(date '+%Y-%m-%d %H:%M:%S') avvio" >> "$REGISTRO"
HOUSEOS_HOUSE="$APP/distribution/windows/house-studio-project.json" \
HOUSEOS_AUTOMATION="$APP/distribution/windows/house-studio-automations.json" \
HOUSEOS_DATA="$DATI" HOUSEOS_HOST="127.0.0.1" HOUSEOS_PORT="$PORTA" \
  nohup "$RUNTIME/bin/node" "$APP/apps/api/dist/custode.js" >> "$REGISTRO" 2>&1 &
disown

for _ in $(seq 1 90); do
  if curl -s "http://127.0.0.1:$PORTA/health" >/dev/null 2>&1; then apri_pannello; exit 0; fi
  sleep 1
done
errore "House Studio non risponde. I dettagli sono in $REGISTRO"
